// 实现一些根据方法
// 1 获取系统时间
// 2 判断文件陆军是否存在，不存在则创建路径
// 3 划分日志等级

/*
标准 mkdir 函数的局限性
‌只能创建单级目录‌：一次调用只能创建路径中的最后一级目录
‌要求上级目录必须存在‌：路径中所有上级目录都必须已经存在
‌缺失目录报错‌：如果路径中有任何一级目录不存在，调用会失败
*/
#pragma once
#include <time.h>
#include <iostream>
#include <filesystem> //c++17
#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
namespace Unit
{
    class Date
    {
    public:
        static time_t GetTimeStampe()
        {
            // 获取当前时间戳单位 秒
            return time(nullptr);
        }
    };

    // 提供三个方法：1 检查路径是否存在 2 获取完整路径 3 创建目录
    class File
    {
    public:
        // 1 检查路径：./a/b/c.txt(当前路径)  c.txt(只给文件名则默认在当前路径) /a/b/c.txt(绝对路径)
        static bool PathExist(const std::string &pathname)
        {
            // return std::filesystem::exists(pathname.c_str());c++17
            // 保证跨平台下建议用系统调用
            struct stat st; // 定义一个结构体获取指定路径(相对和绝对)的文件的属性
            // 获取文件属性成功则返回0，不成功即指定路径的文件不存在
            // 也能判断指定路径（目录）是否存在，因为目录也是文件
            if (stat(pathname.c_str(), &st) == 0)
            {
                return true;
            }
            return false;
        }
        // 2 获取文件路径: ./a/b/c.txt  c.txt(只给文件名则默认在当前路径) /a/b/c.txt(绝对路径)
        //  a/b/c.txt(相对路径,默认在当前路径下)
        static std::string GetPath(const std::string &pathname)
        {
            // find_last_of("/\\");获取/或者\(windows)最后一次出现的位置
            size_t pos = pathname.find_last_of("/\\");
            // 从pos开始截取子串,没有找着说明文件在当前路径
            if (pos == std::string::npos)
                return ".";
            // 如果是当前路径
            if (pathname[0] != '/' && pathname[0] != '.')
                return "./" + pathname.substr(0, pos);
            
            std::cout<<pathname.substr(0, pos)<<std::endl;
            return pathname.substr(0, pos);
        }

        // 3 创建目录 ./asd/dasd && a/b/c (相对路径)  .(当前目录) /adas/ad/ad(绝对目录)
        // mkdir如果给只要一个目录名则在当前目录创建目录
        // 如果给的是一串路径，则只能创建路径最后一级的目录，要求中间的目录必须的存在才行
        static bool MakeDirector(const std::string &path)
        {
            // 如果文件路径为当前项目的工作路径，则不用创建
            if (path == ".")
                return true;
            // 查找第一个目录
            size_t pos = 0;
            pos = path.find_first_of("/");
            std::cout << pos << std::endl;
            // 如果是相对路径和绝对路径，查找第二个/
            if (pos != std::string::npos)
                pos = path.find_first_of("/", pos + 1);

             std::cout<<pos<<std::endl;
            //  如果没有第二个/，说明就在当前路径或者/下创建目录
            if (pos == std::string::npos)
            {
                if (!PathExist(path))
                    mkdir(path.c_str(), 0777);
                return true;
            }
            // 继续找下一级目录
            while (pos < path.size())
            {
                std::string parent_dir = path.substr(0, pos);
                std::cout << parent_dir << std::endl;
                // 如果上一级目录不存在则创建
                if (!PathExist(parent_dir))
                {
                    std::cout << parent_dir << std::endl;
                    mkdir(parent_dir.c_str(), 0777);
                }
                pos = path.find_first_of("/", pos + 1);
                std::cout<<pos<<std::endl;
            }
            if (!PathExist(path))
            {
                //std::cout<<parent_dir<<std::endl;
                mkdir(path.c_str(), 0777);
            }
            return true;
        }
    };

}